// versiond.c

#include <runtime_config.h>

#pragma optimize
// #pragma save_binary

inherit F_DBASE;

#define CONFIG_FILE     CONFIG_DIR "config"

// 配置文件中参数的格式是：  arg : value
// 如果以#打头表示注释，&打头表示是系统注释的。

void load_config();

void create()
{
        seteuid(getuid());
        load_config();
}

void load_config()
{
    string *tmp, file;
        string line;
        string arg, value;
        string last_remember;
        string affix;
        int len;
        int sys_del;

    file = read_file(CONFIG_FILE);
    if (! stringp(file)) return;

        // 去掉"\r"保证和MSDOS的文件格式兼容
        file = replace_string(file, "\r", "");

        sys_del = 0;
    tmp = explode(file, "\n");
        foreach (line in tmp)
        {
                if (sys_del)
                {
                        // 上一个参数是被系统注释掉的
                        last_remember = 0;
                        sys_del = 0;
                }

                // 去掉行首的空格
                while (strlen(line) && line[0] == ' ') line = line[1..<1];
                if (line[0] == '#')
                {
                        // 注释
                        last_remember = line;
                        continue;
                }

                if (line[0] == '&')
                {
                        // 被系统注释的
                        line = line[1..<1];
                        while (strlen(line) && line[0] == ' ') line = line[1..<1];
                        sys_del = 1;
                }

                // 去掉#以后所有的字符
                len = strsrch(line, '#');
                if (len != -1)
                {
                        // 记录尾注
                        affix = line[len..<1];
                        line = line[0..len - 1];
                } else
                        affix = 0;

                if (! strlen(line))
                        continue;

                // 检查该行
                if (sscanf(line, "%s:%s", arg, value) != 2)
                {
                        log_file("config", sprintf("syntax error: <%s>\n", line));
                        continue;
                }

                // 去掉arg末尾的空格
                while ((len = strlen(arg)) > 0 && arg[len - 1] == ' ')
                        arg = arg[0..<2];

                if (! strlen(arg))
                {
                        log_file("config", sprintf("syntax error: <%s>\n", line));
                        last_remember = 0;
                        continue;
                }

                // 去掉value打头的空格
                while (strlen(value) && value[0] == ' ')
                        value = value[1..<1];

                // 去掉value末尾的空格
                while ((len = strlen(value)) > 0 && value[len - 1] == ' ')
                        value = value[0..<2];

                if (! sys_del)
                {
                        // 系统没有注释这个参数
                        set(arg, value);
                        sys_del = 0;
                }

                if (stringp(last_remember))
                {
                        // 如果有注释，则加上
                        set_temp("remember/" + arg, last_remember);
                        last_remember = 0;
                }

                if (stringp(affix))
                {
                        // 如果有尾注，则加上
                        set_temp("affix/" + arg, affix);
                        affix = 0;
                }
        }
}

// 返回整数参数
int query_int(string index)
{
        int result;

        if (! intp(result = query(index)))
        {
                // 不是INT类型的值
                if (stringp(result))
                        // 是字符串吗？如果是则取值
                        sscanf(result, "%d", result);
                else
                        result = 0;
                set(index, result);
        }

        return result;
}

// 返回字符串参数
string query_string(string index)
{
        string result;

        if (! stringp(result = query(index)))
                result = "unknow";

        return result;
}

// 返回参数的注释
string query_remember(string index)
{
        return query_temp("remember/" + index);
}

// 返回参数的尾注
string query_affix(string index)
{
        return query_temp("affix/" + index);
}

// 返回配置文件的名字
string query_config_file_name() { return CONFIG_FILE; }
